class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        //每个篮子只能装一种水果，两个篮子
        //每颗树只能摘一个
        //转换：找到最长子数组，里面的水果类型种类<=2
        //水果种类:哈希
        int n=fruits.size();
        unordered_map<int,int> hash;
        int ret=0;
        //开始遍历
        for(int left=0,right=0;right<n;right++)
        {
            hash[fruits[right]]++;             //进窗口，统计水果种类
            //水果种类大于2
            while(hash.size()>2)        //出窗口(直到减到水果种类刚好=2)
            {
                hash[fruits[left]]--;
                //如果减到0，元素删去
                if(hash[fruits[left]]==0)
                {
                    hash.erase(fruits[left]);
                }
                left++;
            }
            ret=max(ret,right-left+1);  //计算水果种类刚刚2种时的
        }
        return ret;
    }
};
//当数据有限时，用数组代替哈希表，提高速度
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int n=fruits.size();
        int hash[100001]={0};       //数组模拟哈希表
        int kind=0; //水果种类 
        int ret=0;
        //开始遍历
        for(int left=0,right=0;right<n;right++)
        {
            if(hash[fruits[right]]==0) 
                kind++;  //水果种类加1
            hash[fruits[right]]++;             //进窗口，统计水果种类
            //水果种类大于2
            while(kind>2)        //出窗口(直到减到水果种类刚好=2)
            {
                hash[fruits[left]]--;
                //如果减到0，元素删去
                if(hash[fruits[left]]==0)
                {
                    kind--;         //水果种类减1
                }
                left++;
            }
            ret=max(ret,right-left+1);  //计算水果种类刚刚2种时的
        }
        return ret;
    }
};